//package com.example.chatweb.controller;
//
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.example.chatweb.dto.TransferDTO;
//import com.example.chatweb.entity.PersonalBase;
//import com.example.chatweb.entity.PersonalBaseKey;
//import com.example.chatweb.entity.UserKnowledgeHub;
//import com.example.chatweb.request.SelectPdfByHubIdRequest;
//import com.example.chatweb.request.UploadPersonalPdfRequest;
//import com.example.chatweb.service.BigBaseService;
//import com.example.chatweb.service.FileService;
//import com.example.chatweb.service.PersonalBaseService;
//import com.example.chatweb.service.UserKnowledgeHubService;
//import com.example.chatweb.utils.HttpUtil;
//import com.example.chatweb.utils.MyExceptionHandler;
//import com.example.chatweb.utils.R;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.hy.corecode.idgen.WFGIdGenerator;
//import java.text.DateFormat;
//import java.text.ParseException;
//import java.text.SimpleDateFormat;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.MediaType;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.RestController;
//import org.springframework.web.multipart.MultipartFile;
//
//
//@RestController
//@Slf4j
//public class PersonalBaseController {
//
//	@Autowired
//	private PersonalBaseService personalBaseService;
//	@Autowired
//	private BigBaseService bigBaseService;
//	@Autowired
//	private WFGIdGenerator wFGIdGenerator;
//	@Autowired
//	private UserKnowledgeHubService userKnowledgeHubService;
//
//	@Autowired
//	private HttpUtil httpUtil;
//
//
//	@PostMapping("/selectPersonalPdfs")
//	public R selectPersonalPdfs() {
//		List<PersonalBase> personalpdfs = personalBaseService.list(null);
//		return R.ok("查询成功", personalpdfs);
//	}
//
//	@PostMapping("/selectPdfByHubId")
//	public R getPdfByHubId(@RequestBody SelectPdfByHubIdRequest selectPdfByHubIdRequest) {
//		Long hubUuid = selectPdfByHubIdRequest.getHubUuid();
//		List<PersonalBase> pdfs = personalBaseService.getPdfsByHubUuid(hubUuid);
//
//		if (pdfs == null) {
//			return R.failure("查询失败");
//		}
//		return R.ok("查询成功", pdfs);
//	}
//
//	@PostMapping("/addPersonalPdf")
//	public R addPersonalPdf(@RequestBody PersonalBase personalBase) {
//		personalBase.setPdfUuid(Long.valueOf(wFGIdGenerator.next()));
//		boolean i = personalBaseService.save(personalBase);
//		if (i) {
//			return R.ok("添加成功");
//		} else {
//			return R.failure("添加失败");
//		}
//	}
//
//
//	@PostMapping("/delete")
//	public R deletePersonalBase(@RequestBody PersonalBaseKey personalBaseKey) {
//		Long pdfUuid = personalBaseKey.getPdfUuid();
//		Long hubUuid = personalBaseKey.getHubUuid();
//		// 调用 Service 层的方法执行删除操作
//		boolean deleteResult = personalBaseService.deletePersonalBase(pdfUuid, hubUuid);
//		// 根据删除结果返回响应
//		if (deleteResult) {
//			return R.ok("数据删除成功");
//		} else {
//			return R.failure("没有数据被删除");
//		}
//	}
//
//	@PostMapping("/update")
//	public R updatePersonalBase(@RequestBody PersonalBase personalBase) {
//		// 调用 Service 层的方法执行更新操作
//		boolean updateCount = personalBaseService.updatePersonalBaseByPrimaryKey(personalBase);
//
//		// 根据更新结果返回响应
//		if (updateCount) {
//			return R.ok("数据更新成功");
//		} else {
//			return R.failure("没有数据被更新");
//		}
//	}
//
//	@PostMapping(value = "/transfer", consumes = MediaType.APPLICATION_JSON_VALUE)
//	public R transferFromBigToPersonal(@RequestBody TransferDTO request) {
//		Long pdfUuid = request.getPdfUuid();
//		Long hubUuid = request.getHubUuid();
//		boolean exists = personalBaseService.checkIfPdfExists(pdfUuid, hubUuid);
//		if (exists) {
//			return R.failure("个人知识库内已经存在该文章");
//		}
//
//		personalBaseService.copyFromBigToPersonal(pdfUuid, hubUuid);
//		return R.ok("数据已成功从大库复制到个人库");
//	}
//
//
//	@Autowired
//	private FileService fileService;
//
//
//	@PostMapping("/uploadPersonalPdf")
//	public R uploadPdfFile(@RequestParam("file") MultipartFile file,
//	 @RequestParam("postJSON") String postJSON) {
//		try {
//			// 获取字符串对象
//			ObjectMapper objectMapper = new ObjectMapper();
//			UploadPersonalPdfRequest uploadPersonalPdfRequest = objectMapper.readValue(postJSON,
//			 UploadPersonalPdfRequest.class);
//
//			long snowflakeId = wFGIdGenerator.next();
//			String pdfUuid = String.valueOf(snowflakeId); // 将ID转换为字符串
//
//			//String uuidString = UUID.randomUUID().toString().replaceAll("-", ""); // 移除UUID中的连字符
//			//String uuid64Bit = uuidString.substring(0, 16); // 取UUID的前64位（16个字符）
//			//Long pdfUuid = Long.parseLong(uuid64Bit, 16); // 将64位的字符串转换为Long
//
//			//String pdfUuidString = String.valueOf(pdfUuid);
//			String fileExtension = "";
//
//			String originalFilename = file.getOriginalFilename();
//			//String fileExtension = "";
//			int dotIndex = originalFilename.lastIndexOf('.');
//			if (dotIndex > 0) {
//				fileExtension = originalFilename.substring(dotIndex);
//			} else {
//				fileExtension = ".pdf"; // 如果没有文件扩展名，则默认使用.pdf
//			}
//
//			// 使用pdfUuid和文件后缀构建新的文件名
//			// 这里我们将BigInteger转换为字符串，并取其后若干位以保持文件名长度适中
//			//String pdfUuidString = pdfUuid.toString(32);
//			//String newFilename = pdfUuidString + fileExtension;
//
//			String newFilename = pdfUuid + fileExtension;
//
//			// 创建PersonalBase对象并设置属性
//			//PersonalBase personalBase = new PersonalBase();
//			//personalBase.setPdfUuid(pdfUuid); // 设置BigInteger类型的pdf_uuid
//			PersonalBase personalBase = new PersonalBase();
//			personalBase.setPdfUuid(snowflakeId); // 直接设置字符串类型的pdf_uuid
//			personalBase.setPublicTime(new Date()); // 设置上传时间为当前时间
//			personalBase.setHubUuid(uploadPersonalPdfRequest.getHubUuid());
//
//			// 判断是否是自动解析，如果是自动解析则根据doi访问微服务，不然就直接使用前端传过来的数据、
//			if (uploadPersonalPdfRequest.getIsAutoParse()) {
//				// 调用自动获取微服务
//				String url = "http://10.112.203.120:8820/download_meta";
//				Map<String, Object> params = new HashMap<>();
//				params.put("doi", uploadPersonalPdfRequest.getPdfMeta().getDoi());
//				JSONObject response = httpUtil.post(url, params);
//				JSONObject res = response.getJSONObject("data");
//				//	设置使用的元数据
//				// DOI
//				personalBase.setDoi(uploadPersonalPdfRequest.getPdfMeta().getDoi());
//				// 作者
//				String author = res.getString("author");
//				//	去除所有的[]以及中间的内容
//				personalBase.setAuthor(author.replaceAll("\\[.*?]", ""));
//				//  判断论文作者是否过长，只保留前200个字符
//				if (personalBase.getAuthor().length() > 200) {
//					personalBase.setAuthor(author.substring(0, 200));
//				}
//				// 论文标题
//				String title = res.getString("title");
//				personalBase.setTitle(title.replaceAll("\\[.*?]", ""));
//				// 判断标题是否过长，保留前200个字符
//				if (personalBase.getTitle().length() > 200) {
//					personalBase.setTitle(title.substring(0, 200));
//				}
//				// 出版刊物
//				String publisher = res.getString("publisher");
//				personalBase.setPublicJournal(publisher.replaceAll("\\[.*?]", ""));
//				// 保证出版物不能超过150个字符
//				if (personalBase.getPublicJournal().length() > 150) {
//					personalBase.setPublicJournal(publisher.substring(0, 150));
//				}
//				// 出版时间
//				String pubDate = res.getString("pub_date");
//				if (pubDate != null && !pubDate.isEmpty()) {
//					DateFormat fmt1 = new SimpleDateFormat("yyyy-MM-dd");
//					DateFormat fmt2 = new SimpleDateFormat("yyyy-MM");
//					DateFormat fmt3 = new SimpleDateFormat("yyyy");
//					Date date = null;
//					// 采用多重错误控制确定使用哪种解析方式
//					try {
//						date = fmt1.parse(pubDate);
//					} catch (ParseException e1) {
//						try {
//							date = fmt2.parse(pubDate);
//						} catch (ParseException e2) {
//							try {
//								date = fmt3.parse(pubDate);
//							} catch (ParseException e3) {
//								throw new MyExceptionHandler("自动解析论文发布时间出现错误");
//							}
//						}
//					} catch (Exception e) {
//						throw new MyExceptionHandler("自动解析论文发布时间时，出现未知错误");
//					}
//					if (date != null) {
//						personalBase.setPublicTime(date);
//					}
//				}
//
//				//	检查是否是会议论文
//				String type = res.getString("type");
//				if (type.contains("proceedings")) {
//					personalBase.setIsConference(true);
//					//	设置会议名称
//					String conference = res.getString("venue");
//					personalBase.setConferenceName(conference.replaceAll("\\[.*?]", ""));
//
//				} else {
//					personalBase.setIsConference(false);
//				}
//
//			} else {
//				// 直接使用前端传递数据
//				personalBase.setTags(uploadPersonalPdfRequest.getPdfMeta().getTags());
//				personalBase.setDoi(uploadPersonalPdfRequest.getPdfMeta().getDoi());
//				personalBase.setTitle(uploadPersonalPdfRequest.getPdfMeta().getTitle());
//				personalBase.setKeyword(uploadPersonalPdfRequest.getPdfMeta().getKeyword());
//				personalBase.setAuthor(uploadPersonalPdfRequest.getPdfMeta().getAuthor());
//				personalBase.setAffiliation(uploadPersonalPdfRequest.getPdfMeta().getAffiliation());
//				personalBase.setPublicJournal(
//				 uploadPersonalPdfRequest.getPdfMeta().getPublicJournal());
//				personalBase.setPublicTime(uploadPersonalPdfRequest.getPdfMeta().getPublicTime());
//				personalBase.setIsConference(
//				 uploadPersonalPdfRequest.getPdfMeta().getIsConference());
//				personalBase.setConferenceName(
//				 uploadPersonalPdfRequest.getPdfMeta().getConferenceName());
//				personalBase.setConferenceTime(uploadPersonalPdfRequest.getPdfMeta()
//				 .getConferenceTime());
//			}
//
//			// 调用文件服务上传文件并获取静态URL，使用新的文件名
//			String staticUrl = fileService.uploadFile(file.getInputStream(), "pdf_directory",
//			 newFilename);
//			personalBase.setStaticUrl(staticUrl);
//			// 保存PersonalBase对象到数据库
//			personalBaseService.save(personalBase);
//
//			// 返回上传成功的响应
//			return R.ok("PDF文件上传成功", personalBase);
//		} catch (Exception e) {
//			// 处理异常并返回错误响应
//			log.error("PDF文件上传失败", e);
//			return R.failure("PDF文件上传失败: " + e.getMessage(), HttpStatus.BAD_REQUEST);
//		}
//	}
//
//	@PostMapping("/create_personal_base")
//	public R createPersonalBase(@RequestBody UserKnowledgeHub userKnowledgeHubRequest) {
//		Long userUuid = userKnowledgeHubRequest.getUserUuid();
//		//	创建新的个人知识库
//		if (userUuid == null) {
//			return R.failure("上传用户id为空");
//		}
//		try {
//			UserKnowledgeHub userKnowledgeHub = new UserKnowledgeHub();
//			userKnowledgeHub.setUserUuid(userUuid);
//			userKnowledgeHub.setHubName("新建知识库名称");
//			userKnowledgeHubService.save(userKnowledgeHub);
//			return R.ok(userKnowledgeHub);
//		} catch (Exception e) {
//			log.error("创建个人知识库失败", e);
//			return R.ok("创建个人知识库失败");
//		}
//	}
//
//	@PostMapping("/update_knowledge_hub_name")
//	public R updateKnowledgeHubName(@RequestBody UserKnowledgeHub userKnowledgeHubRequest) {
//		//	更新知识库名称
//		if (userKnowledgeHubRequest.getHubUuid() == null) {
//			return R.failure("知识库id为空");
//		}
//		if (userKnowledgeHubRequest.getHubName() == null || userKnowledgeHubRequest.getHubName()
//		 .isEmpty()) {
//			return R.failure("知识库名称为空");
//		}
//		try {
//			userKnowledgeHubService.updateById(userKnowledgeHubRequest);
//			return R.ok(userKnowledgeHubRequest);
//		} catch (Exception e) {
//			log.error("更新知识库名称失败", e);
//			return R.ok("更新知识库名称失败");
//		}
//
//	}
//
//	@PostMapping("/get_user_base")
//	public R getUserKnowledgeBase(@RequestBody UserKnowledgeHub userKnowledgeHubRequest) {
//		if (userKnowledgeHubRequest.getUserUuid() == null) {
//			return R.failure("上传用户id为空");
//		}
//		try {
//			QueryWrapper<UserKnowledgeHub> queryWrapper = new QueryWrapper<>();
//			queryWrapper.eq("user_uuid", userKnowledgeHubRequest.getUserUuid());
//			List<UserKnowledgeHub> userKnowledgeHubs = userKnowledgeHubService.list(queryWrapper);
//			if (userKnowledgeHubs == null) {
//				return R.failure("查询用户知识库失败");
//			}
//			return R.ok(userKnowledgeHubs);
//		} catch (Exception e) {
//			log.error("查询用户知识库失败", e);
//			return R.failure("查询用户知识库失败");
//		}
//	}
//
//}
